package com.yangfan.thread.thread_wangwenjun03;

/**
 * @description: Synchronized 关键字
 * @author: yangfan
 * @date: Created in 2020/1/26 0026 16:09
 * @modified By:
 */
public class SynchronizedLock implements Runnable {

    /**
     * 叫号 案例  三个线程 为3个服务窗口 分别叫号
     */

    private static volatile int index = 1;//号码牌
    private static final int MAX = 500; //最大排号

    //同步块的多线程并发写法
//    public void run() {
//
//        while (true){
//
//            synchronized (this){
//
//                if (index < MAX){
//
//                    try {
//                        Thread.sleep(1);
//                    } catch (InterruptedException e) {
//                        e.printStackTrace();
//                    }
//
//                    System.out.println(Thread.currentThread().getName()+"叫号:"+ ++index);
//
//                }
//
//
//            }
//
//
//
//        }
//
//
//
//    }


    //同步方法的多线程并发写法
    public void run() {

        while (true) {

            /**
             * 把同步的逻辑单独抽离出来做成同步方法，一个线程并发时只有一个方法能够拿到锁
             */
            if(ticket()){
                break;
            }

        }

    }

    /**
     * 抽离的同步方法
     * @return
     */
    protected synchronized boolean ticket(){

        if (index > MAX)
            return true;
        try {
            Thread.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(Thread.currentThread().getName() + "叫号:" + (index++));
        return false;
    }




    public static void main(String[] args) {

        SynchronizedLock r = new SynchronizedLock();

        Thread t1 = new Thread(r, "1号窗口");
        Thread t2 = new Thread(r, "2号窗口");
        Thread t3 = new Thread(r, "3号窗口");

        t1.start();
        t2.start();
        t3.start();
    }


}
